AndroidStudio使用中的问题
问题1:在创建多项目时,项目混乱,不能熟悉使用Android Studio
解决方案:认真学习Android简介及开发环境
小结:熟悉了Android Studio开发环境
问题2:向GitHub上传编程项目时,提示框显示上传失败
解决方案:重新配置GitBash,重启Android Studio
小结:熟悉如何用Android Studio向GitHub上传编程项目
编程项目3
问题:对类图不熟悉,导致界面混乱,监听器熟练度不高
解决方案:认真看PPT,熟悉了监听器
小结:学会了常用控件TextView,EditText,Button,Checkbox,RadioButton的继承关系和使用,对监听器的使用更加熟悉
编程项目4
通过ListView项目掌握了用列表显示信息,列表每项未必是一个简单的字符串,可能包含各种参数,如本例的每个item包括姓名,学号,年龄,性别等参数,首先为每一项内容如何显示建立一个布局文件,该布局文件必须是一个单独的文件,其次准备好要显示的数据,然后装配适配器,最后为列表设置该适配器,将数据和显示结合起来。在代码编写时遇到以下问题:
1.由于列表中每个item显示内容为五部分(姓名,学号,班级,年龄,性别),要考虑哪部分在布局文件中由哪个组件显示,并且显示的内容是什么。
解决方法:使用Map是键值对,将这五个个键分别定义为类的私有静态成员;为显示两组以上数据,使用List来容纳这些数据,使用一个for循环填充数据;布局文件中id为负责显示每个Map中的键对应的值,使用SimpleAdapter来完成这项功能。
小结:
(1)理解了数据和列表之间连接的具体做法,即使用Adapter(适配器)作为数据和列表之间的连接:列表负责前端显示,数据源负责提供数据,这些数据可能是数组数据,也可能是来自数据库等。
(2)构造ArrayAdapter对象需要三个参数,其中包括列表中每一项的显示布局和字符串数组。
编程项目8
问题:在编写内部类变量时,没有加final
小结:从内部类中访问本地变量时;,需要被声明为最终类型
存在非法字符
问题:android studio 非法字符: \65279 Error:(1, 10) 错误: 需要class, interface或enum
这个错误是文件BOM导致的
解决方案:只要将文件编码方式改掉就行,不要使用UTF-8 WITH BOM(UTF-8包含签名)
简单的把文件删除,在Android Studio新建文件,再把原文件内容粘贴过去就行
编程项目6
要求设计选项菜单,上下文菜单,以及弹出菜单,一开始对菜单的理解不到位,例如不理解选项菜单为什么在app右上角生成,以及不知道弹出菜单和上下文菜单的出现方式。原先的设想是将三个菜单做成三个按钮在一个页面上显示,通过按不同按钮显示不同菜单,这个想法对上下文菜单和弹出菜单的实现可以完成,但是不具有实用性,通过有关资料的阅读,并在完成代码,运行APP时才得以理解菜单的生成方式。
问题1:将下列item加入相应菜单的xml文件时发现@string/button_Another语句报错。
解决:将@string删除,直接将title用button_Another表示即可。
问题2:只能在设置点击按钮时才能弹出菜单,无法在点击界面时弹出菜单
解决:为界面元素添加“android:onClick”属性,即android:onClick="showPopup"。当用户单击时调用showPopup()方法。
小结:
(1)用户选择一个菜单项,系统会调用Activity的onOptionsItemSelected(MenuItem item)方法,可以使用item.getItemId()方法得到菜单项的唯一资源ID。
(2)为界面元素使用registerForContextMenu()注册上下文菜单,当注册后的界面元素收到长按事件时,系统将调用 onCreateContextMenu() 方法创建菜单。
(3)弹出菜单设置需要在类MainActivity中添加PopupMenu.OnMenuItemClickListener接口,即:
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener{…}
编程12
问题:在多次编辑时,出现
原因:SDK版本不一样
解决:下载相应的SDK版本,然后重启android stdio
编程24startService启动服务
问题:在通过参数service启动时,因为支持隐式启动,导致编程失败
调整后代码如下:
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, MyService.class);
intent.putExtra("num",10);
startService(intent);
}
});
stop = (Button)findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);
}
});
总结:
1.调用方使用Context.startService(intent)启动Service,如果原来Service没有启动,则创建该Service并启动,这意味着Service的onCreate()被回调,然后onStartCommand()方法被回调;如果Service已经运行,在该Service仍然运行,不再重新创建新的Service,这就意味着onCreate()不再被回调,仅仅onStartCommand()方法被回调。
2.当Service被启动后,调用方和Service之间就没有什么关联了。因此如果调用方终止,Service仍然可以继续运行。用户可以使用stopService()停止服务。ComponentName startService (Intent service),boolean stopService (Intent service)
3.参数service一定要明确指出启动的Service,即仅支持显式启动,不支持隐式启动。如果调用方需要向Service传递参数,可以使用Intent的putExtra()等方法将值传递过去,Service在ononStartCommand()中接收。
编程25使用bindService启动服务
问题:使用bindservice启动service,在demo中测试是正常的,但是在项目中怎么也没有启动。
解决:在网上找了资料发现原来是activity的原因:我的activity是继承了另外一个activity,所以启动不了,把context换为this.getApplicationContext()就解决了这个问题。这里要注意的是当activity是包括在TabActivity中也是不行的,
可以参考这位兄弟的博文:http://hi.baidu.com/zhourunsheng/item/d70a10d7cbe3d9cf1a72b407;
各位请注意了,在解绑的时候同样也是要把context替换为:this.getApplicationContext();否则会报java.lang.IllegalArgumentException: Service not registered错误!
总结:
1.如果调用方需要和Service进行通信,则使用Context.startService()方法启动Service是不行的,必须使用Context.bindService()启动Service,使用该方法启动Service后,就可以实现调用方和Service的通信,此时Service就和调用方”绑定”在一起,Service的生存就依附于调用方,如果调用方终止,Service也必须终止。
2.当调用方创建Service后,首先回调onCreate()方法,然后建立双发的连接,执行“绑定”,回调onBind()方法。在onBind()方法中必须返回一个IBinder接口类型的对象,该IBinder对象回传给调用方,调用方通过此对象和Service进行交互,因此这里定义了一个从Binder派生的LocalBinder类,该类仅有一个getService()方法,通过此方法得到Service实例。
编程26Handler
问题:在编程时,我让子线程处于不断循环状态,直到主线程做完响应后再将布尔变量赋为false,从而使得子线程根据响应结果继续执行,然而主线程处理消息异常
解决:子线程处理主线程所传递信息的操作会由于之前子线程在某一点不断循环而无法进行,这也说明重写的Handler类中的handleMessage方法也是在子线程中执行的。
Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 Handler 常用方法:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中, sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
逻辑:点击button --- > 启动一条新线程,用来处理数据 ---- >数据处理完毕,通过handler返回 ----- > handler里面接收返回的数据,进行UI更新等处理。
编程27广播
问题:广播接收器遇到问题
解决:查阅相关资料以后我发现,需要动态注册,静态的不行
编程28MediaPlayer
问题:在编写MediaPlayer,出现error(1, -2147483648)
解决:error (1, -2147483648)说明MediaPlayer代码逻辑写错了,Android的MediaPlayer包含了Audio和video的播放功能
小结:获得MediaPlayer实例
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
编程30简单绘制图形
问题:模拟器崩掉以后,重新安装更新Android,模拟器尺寸不一样,原代码图形发生改变
解决:缩小相应图形大小以适应模拟器